home *** CD-ROM | disk | FTP | other *** search
- ;;; -*- Mode: Lisp; Package: Maxima; Syntax: Common-Lisp; Base: 10 -*- ;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; The data in this file contains enhancments. ;;;;;
- ;;; ;;;;;
- ;;; Copyright (c) 1984,1987 by William Schelter,University of Texas ;;;;;
- ;;; All rights reserved ;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; ** (c) Copyright 1980 Massachusetts Institute of Technology **
-
- (in-package "MAXIMA")
- (macsyma-module psolve)
-
- (DECLARE-TOP(GENPREFIX PSO)
- (SPECIAL MULT *ROOTS *FAILURES $SOLVEFACTORS))
-
- (DECLARE-TOP(SPLITFILE SCUBIC))
-
- (DEFMVAR FLAG4 NIL)
-
- (DEFMFUN SOLVECUBIC (X)
- (PROG (S1 A0 A1 A2 DISCR LCOEF ADIV3 OMEGA^2 PDIV3 QDIV-2
- OMEGA Y1 U y2)
- (SETQ X (CDR X))
- (SETQ LCOEF (CADR X))
- (SETQ ADIV3
- (LIST '(MTIMES)
- '((RAT) -1. 3.)
- (RDIS (SETQ A2 (RATREDUCE (PTERM X 2.)
- LCOEF)))))
- (SETQ A1 (RATREDUCE (PTERM X 1.) LCOEF))
- (SETQ A0 (RATREDUCE (PTERM X 0.) LCOEF))
- (SETQ S1 '((MTIMES)
- ((RAT) 1. 2.)
- $%I
- ((MEXPT) 3. ((RAT) 1. 2.))))
- (SETQ OMEGA (LIST '(MPLUS)
- '((RAT) -1. 2.)
- S1)
- OMEGA^2 (LIST '(MPLUS)
- '((RAT) -1. 2.)
- (LIST '(MTIMES) -1. S1)))
- (SETQ PDIV3
- (MEVAL* (RDIS (RATPLUS (RATTIMES A1 '(1. . 3.) T)
- (RATTIMES (RATEXPT A2 2.)
- '(-1. . 9.)
- T)))))
- (AND (NOT (EQUAL PDIV3 0.)) (GO HARDER))
- (SETQ
- Y1
- (SIMPTIMES
- (LIST
- '(MTIMES)
- '((RAT) 1. 3.)
- (LIST '(MPLUS)
- (SIMPNRT (RDIS (setq y2 (RATPLUS (RATEXPT A2 3.)
- (RATTIMES '(-27. . 1.)
- A0
- T))))
- 3)
- (LIST '(MTIMES) -1. (RDIS A2))))
- 1.
- NIL))
- (AND FLAG4 (RETURN (SOLVE3 Y1 MULT)))
- (setq y2 (simpnrt (rdis (rattimes y2 '(1. . 27.) t))
- 3))
- (RETURN (MAPC #'(LAMBDA (J) (SOLVE3 J MULT))
- (LIST Y1
- (LIST '(MPLUS)
- (LIST '(MTIMES)
- OMEGA
- Y2)
- ADIV3)
- (LIST '(MPLUS)
- (LIST '(MTIMES)
- OMEGA^2
- Y2)
- ADIV3))))
- HARDER
- (SETQ
- QDIV-2
- (RDIS (RATPLUS (RATTIMES (RATPLUS (RATTIMES A1 A2 T)
- (RATTIMES '(-3. . 1.)
- A0
- T))
- '(1. . 6.)
- T)
- (RATTIMES (RATEXPT A2 3.)
- '(-1. . 27.)
- T))))
- (COND ((EQUAL QDIV-2 0.)
- (SETQ U (SIMPNRT PDIV3 2))
- (SETQ Y1 ADIV3))
- (T (SETQ DISCR (SIMPLUS (LIST '(MPLUS)
- (LIST '(MEXPT)
- PDIV3
- 3.)
- (LIST '(MEXPT)
- QDIV-2
- 2.))
- 1.
- NIL))
- (COND ((EQUAL DISCR 0.)
- (SETQ U (SIMPNRT QDIV-2 3)))
- (T (SETQ DISCR (SIMPNRT DISCR 2))
- (AND (COMPLICATED DISCR)
- (SETQ DISCR (adispline DISCR)))
- (SETQ U (SIMPEXPT (LIST '(MEXPT)
- (LIST '(MPLUS)
- QDIV-2
- DISCR)
- '((RAT) 1 3)) 1 NIL))
- (AND (COMPLICATED U)
- (SETQ U (adispline U)))))))
- (IF (EQUAL U 0) (MERROR "Arithmetic overflow - SOLVECUBIC"))
- (OR Y1
- (SETQ Y1 (SIMPLUS (LIST '(MPLUS)
- ADIV3
- U
- (LIST '(MTIMES)
- -1.
- PDIV3
- (LIST '(MEXPT)
- U
- -1.)))
- 1.
- NIL)))
- (RETURN
- (COND (FLAG4 (SOLVE3 Y1 MULT))
- (T (MAPC
- #'(LAMBDA (J) (SOLVE3 J MULT))
- (LIST Y1
- (LIST '(MPLUS)
- ADIV3
- (LIST '(MTIMES) OMEGA U)
- (LIST '(MTIMES)
- -1.
- PDIV3
- OMEGA^2
- (LIST '(MEXPT)
- U
- -1.)))
- (LIST '(MPLUS)
- ADIV3
- (LIST '(MTIMES) OMEGA^2 U)
- (LIST '(MTIMES)
- -1.
- PDIV3
- OMEGA
- (LIST '(MEXPT)
- U
- -1.))))))))))
-
- (declare-top (SPLITFILE SQUART))
-
- (DEFMFUN SOLVEQUARTIC (X)
- (PROG (A0 A1 A2 B1 B2 B3 B0 LCOEF Z1 R TR1 TR2 D D1 E SQB3)
- (SETQ X (CDR X) LCOEF (CADR X))
- (SETQ B3 (RATREDUCE (PTERM X 3.) LCOEF))
- (SETQ B2 (RATREDUCE (PTERM X 2.) LCOEF))
- (SETQ B1 (RATREDUCE (PTERM X 1.) LCOEF))
- (SETQ B0 (RATREDUCE (PTERM X 0.) LCOEF))
- (SETQ A2 (RATMINUS B2))
- (SETQ A1 (RATDIF (RATTIMES B1 B3 T)
- (SETQ A0 (RATTIMES B0
- '(4. . 1.)
- T))))
- (SETQ A0
- (RATDIF (RATDIF (RATTIMES B2 A0 T)
- (RATTIMES (SETQ SQB3
- (RATEXPT B3 2.))
- B0
- T))
- (RATEXPT B1 2.)))
- (SETQ
- TR2
- (SIMPLIFY (RDIS
- (RATTIMES
- '(1. . 4.)
- (RATDIF (RATDIF (RATTIMES B3
- (RATTIMES B2
- '(4. . 1.)
- T)
- T)
- (RATTIMES '(8. . 1.) B1 T))
- (RATTIMES SQB3 B3 NIL))
- T))))
- (SETQ Z1 (RESOLVENT A2 A1 A0))
- (SETQ R
- (SIMPLUS (LIST '(MPLUS)
- Z1
- (RDIS (RATDIF (RATTIMES SQB3
- '(1. . 4.)
- T)
- B2)))
- 1.
- NIL))
- (AND (EQUAL R 0.) (GO L0))
- (SETQ R (SIMPNRT R 2))
- (AND (COMPLICATED R) (SETQ R (adispline R)))
- (AND (COMPLICATED TR2) (SETQ TR2 (adispline TR2)))
- (SETQ TR1
- (SIMPLUS (LIST '(MPLUS)
- (RDIS (RATDIF (RATTIMES SQB3
- '(1. . 2.)
- T)
- B2))
- (LIST '(MTIMES) -1. Z1))
- 1.
- NIL))
- (AND (COMPLICATED TR1) (SETQ TR1 (adispline TR1)))
- (SETQ TR2 (DIV* TR2 R))
- (GO LB1)
- L0 (SETQ D1
- (SIMPNRT (SIMPLIFY (LIST '(MPLUS)
- (LIST '(MEXPT) Z1 2.)
- (LIST '(MTIMES)
- -4.
- (RDIS B0))))
- 2))
- (SETQ TR2 (SIMPLIFY (LIST '(MTIMES) 2. D1)))
- (AND (COMPLICATED TR2) (SETQ TR2 (adispline TR2)))
- (SETQ TR1
- (SIMPLIFY (RDIS (RATDIF (RATTIMES SQB3 '(3. . 4.) T)
- (RATTIMES B2 '(2. . 1.) T)))))
- (AND (COMPLICATED TR1) (SETQ TR1 (adispline TR1)))
- LB1 (SETQ D (SIMPNRT (SIMPLIFY (LIST '(MPLUS) TR1 TR2)) 2))
- (SETQ E
- (SIMPNRT (SIMPLIFY (LIST '(MPLUS)
- TR1
- (LIST '(MTIMES) -1. TR2)))
- 2))
- (SETQ D (DIV* D 2.))
- (AND (COMPLICATED D) (SETQ D (adispline D)))
- (SETQ E (DIV* E 2.))
- (AND (COMPLICATED E) (SETQ E (adispline E)))
- (SETQ A2 (RDIS (RATTIMES B3 '(-1. . 4.) T)))
- (SETQ A1 (DIV* R 2.))
- (SETQ Z1
- (LIST (LIST '(MPLUS) A2 A1 D)
- (LIST '(MPLUS)
- A2
- A1
- (LIST '(MTIMES) -1. D))
- (LIST '(MPLUS)
- A2
- (LIST '(MTIMES) -1. A1)
- E)
- (LIST '(MPLUS)
- A2
- (LIST '(MTIMES) -1. A1)
- (LIST '(MTIMES) -1. E))))
- (RETURN (MAPC #'(LAMBDA (J) (SOLVE3 J MULT))
- Z1))))
-
- ;;; SOLVES RESOLVENT CUBIC EQUATION
- ;;; GENERATED FROM QUARTIC
-
- (DEFUN RESOLVENT (A2 A1 A0)
- (PROG (*ROOTS FLAG4 *FAILURES $solvefactors) ;undoes binding in
- (SETQ FLAG4 T $solvefactors t) ;algsys
- (SOLVE (SIMPLUS (LIST '(MPLUS)
- (LIST '(MEXPT)
- 'YY
- 3.)
- (LIST '(MTIMES)
- (RDIS A2)
- (LIST '(MEXPT)
- 'YY
- 2.))
- (LIST '(MTIMES)
- (RDIS A1)
- 'YY)
- (RDIS A0))
- 1.
- NIL)
- 'YY
- 1.)
- (COND ((zl-MEMBER 0. *ROOTS) (RETURN 0.)))
- (RETURN (CADDAR (CDR (REVERSE *ROOTS))))))
-
- #-NIL
- (DECLARE-TOP(UNSPECIAL MULT))
-